#include "exti.h"
#include "../VIC/vic_reg.h"
#include "../UART/uart.h"
#include "../LED/led.h"
#include "../PUBLIC/test.h"

void exti_init(){
    // K1 GPIOB28; K2 GPIOB29; K3 GPIOB30； 按下为低电平

    GPIOBALTFN1 &= ~((3 << 24) | (3 << 26) | (3 << 28));    // 交替函数功能选择
    GPIOBALTFN1 |= ((1 << 24) | (1 << 26) | (1 << 28));

    GPIOBOUTENB &= ~((1 << 24) | (1 << 26) | (1 << 28));    // 输入模式
    
    GPIOBDETMODEEX &= ~((1 << 30) | (1 << 29) | (1 << 28));
    GPIOBDETMODE1 &= ~((3 << 28) | (3 << 26) | (3 << 24));
    GPIOBDETMODE1 |= ((2 << 28) | (2 << 26) | (2 << 24));   // 下降沿触发
    GPIOBDETENB |= ((1 << 30) | (1 << 29) | (1 << 28));     // 事件检测使能   

    GPIOBINTENB |= ((1 << 30) | (1 << 29) | (1 << 28));     // 中断使能

    // VICINTENCLEAR_CH1 = (1 << 22);
    // VICINTSELECT_CH1 &= ~(1 << 22);     // IRQ
    // VICVECTADDR_GPIOB = (u32)exti54_ISR;
    // VICINTENABLE_CH1 = (1 << 22);

    vic_init(54, (u32)exti54_ISR);

    // VICSOFTINT_CH1 = (1 << 22);      // 生成软中断，相当于模拟按键

    // GIC 失败
    // GICD_ISENABLER2 |= (1 << 22);
    // GICD_IGROUPR2 |= (1 << 22);
    // GICD_ITARGETSR21 &= ~(0xFF << 16); 
    // GICD_ITARGETSR21 |= (0x01 << 16);   // cpu0

    // GICD_CTLR |= (3 << 0);
    // GICC_CTLR |= (3 << 0);
    // GICD_CTLR |= 0xFFFFFFFF;
    // GICC_CTLR |= 0xFFFFFFFF;
}

void exti54_ISR(){
    print_cpsr();

    if(GPIOBDET & (1 << 28)){
        led1_on();
    }
    if(GPIOBDET & (1 << 29)){
        led2_on();
    }
    if(GPIOBDET & (1 << 30)){
        led1_off();
        led2_off();
    }

    GPIOBDET = GPIOBDET;  
    // VICADDRESS_CH1 = 0x0;
}